package com.example.tmp;


import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;


/**
 * @author Zheng Jie
 * @date 2018-12-03
 */

@RestController
@RequestMapping("/menus")
public class SysMenuController {
    private static final String ENTITY_NAME = "menu";


//    @Log("导出菜单数据")
//    @ApiOperation("导出菜单数据")
//    @GetMapping(value = "/download")
//    @PreAuthorize("hasAnyRole('admin', 'menu:list')")
//    public void download(HttpServletResponse response, SysMenuQueryCriteria criteria) throws IOException {
//        this.sysMenuService.download(this.sysMenuService.queryAll(criteria), response);
//    }
//
//    /**
//     * 构建前端路由所需要的菜单
//     *
//     * @return
//     */
//    @GetMapping(value = "/build")
//    public JsonResult buildMenus() {
//        List<SysMenu> menuDtoList;
//
//        // 系统管理员，返回所有菜单
//        if (SecurityUtils.isRootAdmin()) {
//            menuDtoList = this.sysMenuService.findAllMenus();
//        }
//
//        // 其他，返回已分配的菜单
//        else {
//            menuDtoList = this.sysMenuService.findMenusByRoleId(SecurityUtils.getRoleId());
//        }
//        return JsonResult.ok(this.sysMenuService.buildMenuRoutes(menuDtoList));
//    }
//
//    /**
//     * 可见的菜单
//     */
//    @GetMapping(value = "/tree/visible")
//    public JsonResult getVisibleTree() {
//        SysMenuQueryCriteria criteria = new SysMenuQueryCriteria();
//        criteria.setStatus(1);
//        return JsonResult.ok(this.formatMenusTree(this.sysMenuService.buildMenuTrees(criteria, 0L)));
//    }
//
//    /**
//     * 返回全部的菜单
//     */
//    @GetMapping(value = "/tree")
//    @PreAuthorize("hasAnyRole('admin', 'menu:list')")
//    public JsonResult getMenusTree() {
//        SysMenuQueryCriteria criteria = new SysMenuQueryCriteria();
//        criteria.setNotType(2);
//        return JsonResult.ok(this.formatMenusTree(this.sysMenuService.buildMenuTrees(criteria, 0L)));
//    }
//
//    @GetMapping(value = "/cate")
//    @PreAuthorize("hasAnyRole('admin', 'menu:list')")
//    public JsonResult getCates() {
//        return JsonResult.ok(this.sysMenuService.findByParentId(0L));
//    }
//
//    @GetMapping
//    @PreAuthorize("hasAnyRole('admin', 'menu:list')")
//    public JsonResult getMenus(SysMenuQueryCriteria criteria, @RequestParam(name = "parentId", defaultValue = "0") Long parentId) {
//        Map<String, Object> map = new HashMap<>();
//        map.put("content", this.sysMenuService.buildMenuTrees(criteria, parentId));
//        return JsonResult.ok(map);
//    }
//
//    @Log("新增菜单")
//    @PostMapping
//    @PreAuthorize("hasAnyRole('admin', 'menu:add')")
//    public JsonResult create(@Validated @RequestBody SysMenu resources) {
//        if (resources.getId() != null) {
//            throw new BadRequestException("A new " + ENTITY_NAME + " cannot already have an ID");
//        }
//        return JsonResult.ok(this.sysMenuService.create(resources));
//    }
//
//    @Log("修改菜单")
//    @PutMapping(value = "/{id}")
//    @PreAuthorize("hasAnyRole('admin', 'menu:edit')")
//    public JsonResult update(@PathVariable Long id, @Validated(SysMenu.Update.class) @RequestBody SysMenu resources) {
//        this.sysMenuService.update(id, resources);
//        return JsonResult.ok();
//    }
//
//    @Log("删除菜单")
//    @DeleteMapping(value = "/{id}")
//    @PreAuthorize("hasAnyRole('admin', 'menu:delete')")
//    public JsonResult delete(@PathVariable Long id) {
//        this.sysMenuService.delete(id);
//        return JsonResult.ok();
//    }

    private Object formatMenusTree(List<SysMenu> menuDtos) {
        List<Map<String, Object>> list = new LinkedList<>();
        menuDtos.forEach(menuDto -> {
                    if (menuDto != null) {
                        Map<String, Object> map = new HashMap<>();
                        map.put("id", menuDto.getId());
                        map.put("label", menuDto.getName());
                        map.put("isDisabled", menuDto.getHidden());
                        map.put("status", menuDto.getStatus());
//                        List<SysMenu> menuDtoList = (List<SysMenu>) menuDto.getChildren();
                        List<TreeEntity<Long>> children = menuDto.getChildren();
                        List<SysMenu> menuDtoList = new ArrayList<>();
                        children.forEach(item -> {
                            menuDtoList.add((SysMenu) item);
                        });
                        if (!ObjectUtils.isEmpty(menuDtoList)) {
                            map.put("children", this.formatMenusTree(menuDtoList));
                        }
                        list.add(map);
                    }
                }
        );
        return list;
    }
}
